--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXMF/LXMF.py fa9fd2ae013e39bc604d68d1e516a652b5c66916 (fa9fd2ae) Text, 8.16 KB
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6fflxmfTa5d6ff"
T8b949e##########################################################
T8b949e# The following core fields are provided to facilitate #
T8b949e# interoperability in data exchange between various LXMF #
T8b949e# clients and systems. #
T8b949e##########################################################
Te6edf3FIELD_EMBEDDED_LXMS Tff7b72= T79c0ff0x01
Te6edf3FIELD_TELEMETRY Tff7b72= T79c0ff0x02
Te6edf3FIELD_TELEMETRY_STREAM Tff7b72= T79c0ff0x03
Te6edf3FIELD_ICON_APPEARANCE Tff7b72= T79c0ff0x04
Te6edf3FIELD_FILE_ATTACHMENTS Tff7b72= T79c0ff0x05
Te6edf3FIELD_IMAGE Tff7b72= T79c0ff0x06
Te6edf3FIELD_AUDIO Tff7b72= T79c0ff0x07
Te6edf3FIELD_THREAD Tff7b72= T79c0ff0x08
Te6edf3FIELD_COMMANDS Tff7b72= T79c0ff0x09
Te6edf3FIELD_RESULTS Tff7b72= T79c0ff0x0A
Te6edf3FIELD_GROUP Tff7b72= T79c0ff0x0B
Te6edf3FIELD_TICKET Tff7b72= T79c0ff0x0C
Te6edf3FIELD_EVENT Tff7b72= T79c0ff0x0D
Te6edf3FIELD_RNR_REFS Tff7b72= T79c0ff0x0E
Te6edf3FIELD_RENDERER Tff7b72= T79c0ff0x0F
T8b949e# For usecases such as including custom data structures,
T8b949e# embedding or encapsulating other data types or protocols
T8b949e# that are not native to LXMF, or bridging/tunneling
T8b949e# external protocols or services over LXMF, the following
T8b949e# fields are available. A format/type/protocol (or other)
T8b949e# identifier can be included in the CUSTOM_TYPE field, and
T8b949e# the embedded payload can be included in the CUSTOM_DATA
T8b949e# field. It is up to the client application to correctly
T8b949e# discern and potentially utilise any data embedded using
T8b949e# this mechanism.
Te6edf3FIELD_CUSTOM_TYPE Tff7b72= T79c0ff0xFB
Te6edf3FIELD_CUSTOM_DATA Tff7b72= T79c0ff0xFC
Te6edf3FIELD_CUSTOM_META Tff7b72= T79c0ff0xFD
T8b949e# The non-specific and debug fields are intended for
T8b949e# development, testing and debugging use.
Te6edf3FIELD_NON_SPECIFIC Tff7b72= T79c0ff0xFE
Te6edf3FIELD_DEBUG Tff7b72= T79c0ff0xFF
T8b949e##########################################################
T8b949e# The following section lists field-specific specifiers, #
T8b949e# modes and identifiers that are native to LXMF. It is #
T8b949e# optional for any client or system to support any of #
T8b949e# these, and they are provided as template for easing #
T8b949e# interoperability without sacrificing expandability #
T8b949e# and flexibility of the format. #
T8b949e##########################################################
T8b949e# Audio modes for the data structure in FIELD_AUDIO
T8b949e# Codec2 Audio Modes
Te6edf3AM_CODEC2_450PWB Tff7b72= T79c0ff0x01
Te6edf3AM_CODEC2_450 Tff7b72= T79c0ff0x02
Te6edf3AM_CODEC2_700C Tff7b72= T79c0ff0x03
Te6edf3AM_CODEC2_1200 Tff7b72= T79c0ff0x04
Te6edf3AM_CODEC2_1300 Tff7b72= T79c0ff0x05
Te6edf3AM_CODEC2_1400 Tff7b72= T79c0ff0x06
Te6edf3AM_CODEC2_1600 Tff7b72= T79c0ff0x07
Te6edf3AM_CODEC2_2400 Tff7b72= T79c0ff0x08
Te6edf3AM_CODEC2_3200 Tff7b72= T79c0ff0x09
T8b949e# Opus Audio Modes
Te6edf3AM_OPUS_OGG Tff7b72= T79c0ff0x10
Te6edf3AM_OPUS_LBW Tff7b72= T79c0ff0x11
Te6edf3AM_OPUS_MBW Tff7b72= T79c0ff0x12
Te6edf3AM_OPUS_PTT Tff7b72= T79c0ff0x13
Te6edf3AM_OPUS_RT_HDX Tff7b72= T79c0ff0x14
Te6edf3AM_OPUS_RT_FDX Tff7b72= T79c0ff0x15
Te6edf3AM_OPUS_STANDARD Tff7b72= T79c0ff0x16
Te6edf3AM_OPUS_HQ Tff7b72= T79c0ff0x17
Te6edf3AM_OPUS_BROADCAST Tff7b72= T79c0ff0x18
Te6edf3AM_OPUS_LOSSLESS Tff7b72= T79c0ff0x19
T8b949e# Custom, unspecified audio mode, the client must
T8b949e# determine it itself based on the included data.
Te6edf3AM_CUSTOM Tff7b72= T79c0ff0xFF
T8b949e# Message renderer specifications for FIELD_RENDERER.
T8b949e# The renderer specification is completely optional,
T8b949e# and only serves as an indication to the receiving
T8b949e# client on how to render the message contents. It is
T8b949e# not mandatory to implement, either on sending or
T8b949e# receiving sides, but is the recommended way to
T8b949e# signal how to render a message, if non-plaintext
T8b949e# formatting is used.
Te6edf3RENDERER_PLAIN Tff7b72= T79c0ff0x00
Te6edf3RENDERER_MICRON Tff7b72= T79c0ff0x01
Te6edf3RENDERER_MARKDOWN Tff7b72= T79c0ff0x02
Te6edf3RENDERER_BBCODE Tff7b72= T79c0ff0x03
T8b949e# Optional propagation node metadata fields. These
T8b949e# fields may be highly unstable in allocation and
T8b949e# availability until the version 1.0.0 release, so use
T8b949e# at your own risk until then, and expect changes!
Te6edf3PN_META_VERSION Tff7b72= T79c0ff0x00
Te6edf3PN_META_NAME Tff7b72= T79c0ff0x01
Te6edf3PN_META_SYNC_STRATUM Tff7b72= T79c0ff0x02
Te6edf3PN_META_SYNC_THROTTLE Tff7b72= T79c0ff0x03
Te6edf3PN_META_AUTH_BAND Tff7b72= T79c0ff0x04
Te6edf3PN_META_UTIL_PRESSURE Tff7b72= T79c0ff0x05
Te6edf3PN_META_CUSTOM Tff7b72= T79c0ff0xFF
T8b949e##########################################################
T8b949e# The following helper functions makes it easier to #
T8b949e# handle and operate on LXMF data in client programs #
T8b949e##########################################################
Tff7b72import T7ee787RNS
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack
Tff7b72def Td2a8ffdisplay_name_from_app_dataTb4b4b4(Te6edf3app_dataTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3app_data Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elif Tffa657lenTb4b4b4(Te6edf3app_dataTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
T8b949e# Version 0.5.0+ announce format
Tff7b72if Tb4b4b4(Te6edf3app_dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72>Tff7b72= T79c0ff0x90 Tff7b72and Te6edf3app_dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<Tff7b72= T79c0ff0x9fTb4b4b4) Tff7b72or Te6edf3app_dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== T79c0ff0xdcTb4b4b4:
Te6edf3peer_data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3peer_dataTb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3peer_dataTb4b4b4) Tff7b72< T79c0ff1Tb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3dn Tff7b72= Te6edf3peer_dataTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3dn Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3decoded Tff7b72= Te6edf3dnTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3decoded
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not decode display name in included announce data. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
T8b949e# Original announce format
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3app_dataTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffstamp_cost_from_app_dataTb4b4b4(Te6edf3app_dataTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3app_data Tff7b72== Tff7b72None Tff7b72or Te6edf3app_data Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
T8b949e# Version 0.5.0+ announce format
Tff7b72if Tb4b4b4(Te6edf3app_dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72>Tff7b72= T79c0ff0x90 Tff7b72and Te6edf3app_dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72<Tff7b72= T79c0ff0x9fTb4b4b4) Tff7b72or Te6edf3app_dataTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== T79c0ff0xdcTb4b4b4:
Te6edf3peer_data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3peer_dataTb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3peer_dataTb4b4b4) Tff7b72< T79c0ff2Tb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3peer_dataTb4b4b4[T79c0ff1Tb4b4b4]
T8b949e# Original announce format
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72def Td2a8ffpn_name_from_app_dataTb4b4b4(Te6edf3app_dataTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3app_data Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3pn_announce_data_is_validTb4b4b4(Te6edf3app_dataTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3app_dataTb4b4b4)
Te6edf3metadata Tff7b72= Te6edf3dataTb4b4b4[T79c0ff6Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3PN_META_NAME Tff7b72in Te6edf3metadataTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72return Te6edf3metadataTb4b4b4[Te6edf3PN_META_NAMETb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72return Tff7b72None
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffpn_stamp_cost_from_app_dataTb4b4b4(Te6edf3app_dataTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3app_data Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3pn_announce_data_is_validTb4b4b4(Te6edf3app_dataTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3app_dataTb4b4b4)
Tff7b72return Te6edf3dataTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffpn_announce_data_is_validTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72!= Tffa657bytesTb4b4b4: Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4: Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72< T79c0ff7Tb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Insufficient peer dataTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4: Tffa657intTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Could not decode timebaseTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3dataTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72!= Tff7b72True Tff7b72and Te6edf3dataTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72!= Tff7b72FalseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Indeterminate propagation node statusTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Tffa657intTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Could not decode propagation transfer limitTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Tffa657intTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Could not decode propagation sync limitTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4) Tff7b72!= Tffa657listTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Could not decode stamp costsTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Tffa657intTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Could not decode target stamp costTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Tffa657intTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Could not decode stamp cost flexibilityTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4: Tffa657intTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Could not decode peering costTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3dataTb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4) Tff7b72!= Tffa657dictTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid announce data: Could not decode metadataTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not validate propagation node announce data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────